#include "../code/sistemas.h"

/* Toma las matrices usadas para disparar (que se sabe que tienen un número 
 * de condición elevado y evalúa la efectividad de resolver el sistema 
 * asociado. Se tienen los números de condición de las matrices de entrada. 
 * Esto es para un n fijo. */
int main(int argc, char* argv[])
{
    srand(NULL);
    
    ofstream salida("correlacionDatos.out");
    ifstream matrices("matrices.in");    
    ifstream cond("nroCondicion.in");    
    
    salida.precision(20);
	salida.setf(std::ios_base::scientific, std::ios_base::floatfield); 
	
	int n;
	
    forn(k, 4)
    {
		/* La dimensión. */
		matrices >> n;
		cond >> n;		
		salida << n << endl;
		
		Vector v (n);
		Vector res (n);
		
		Vector x (n);
		
		/* Datos a leer. */
		Matriz m (n, Vector(n));
		double nroCond;		
		
		/* Llenar el vector de números random. */
		generarVector(v, n);		
				
		forn(iter, 100)		
		{
			/* Leer la matríz y el número de condición. */			
		    forn(i, n)
		    {
				forn(j, n)
		            matrices >> m[i][j];
		    }		    
			cond >> nroCond;			
			
			/* Disparar. */
			matrizPorVector(m, v, res, n);				
			
			/* Resolver el sistema. */
			PLUPivoteo(m, res, x, n);			

			/* La distancia euclideana entre el valor de x obtenido y v (valor real). */			
			salida << nroCond << " " << dist(v, x, n) << endl;
		}		
		salida << endl;		
	}
	
	salida.close();
	matrices.close();
	cond.close();	
    
    return 0;
}
